
准备好构建工具后，可以从GitHub中下载LLVM项目，并构建LLVM。这一过程在所有平台上都是相同的:

\begin{enumerate}
\item
配置Git

\item
克隆库

\item
创建构建目录

\item
生成构建系统文件

\item
最后，编译和安装LLVM
\end{enumerate}

先从配置Git开始吧！

\mySubsubsection{1.3.1.}{配置Git}

LLVM项目使用Git进行版本控制。若以前没有使用过Git，在继续之前应该先做一些Git的基本配置:设置用户名和电子邮件地址。提交修改，将使用这两个信息。

可以使用以下命令检查是否已经在Git中配置了电子邮件和用户名:

\begin{shell}
$ git config user.email
$ git config user.name
\end{shell}

前面的命令将输出在使用Git时已经设置的电子邮件和用户名，但若是第一次设置用户名和电子邮件，可以输入以下命令进行第一次配置。以下命令中，可以简单地将Jane替换为您的姓名，将jane@email.org替换为您的电子邮件:

\begin{shell}
$ git config --global user.email "jane@email.org"
$ git config --global user.name "Jane"
\end{shell}

这些命令更改全局Git配置。在Git存储库中，可以不指定-{}-global选项在本地覆盖这些值。

默认情况下，Git使用vi编辑器提交消息。若喜欢其他编辑器，可以以类似的方式更改配置。例如：要使用nano编辑器，可以输入以下命令:

\begin{shell}
$ git config --global core.editor nano
\end{shell}

有关Git的更多信息，请参阅Git版本控制手册(\url{https:// www.packtpub.com/product/git-version-control-cookbook-secondedition/9781789137545})。

现在可以从GitHub克隆LLVM了。

\mySubsubsection{1.3.2.}{克隆库}

克隆库的命令在所有平台上基本上是相同的。仅在Windows上，建议关闭行结束符的自动翻译。

在所有非windows平台上，输入以下命令克隆库:

\begin{shell}
$ git clone https://github.com/llvm/llvm-project.git
\end{shell}

仅在Windows上，添加禁用行结束符自动翻译的选项，可输入以下内容:

\begin{shell}
$ git clone --config core.autocrlf=false \
  https://github.com/llvm/llvm-project.git
\end{shell}

这个Git命令将最新的源代码从GitHub克隆到一个名为llvm-project的本地目录中。现在使用以下命令，将当前目录切换到llvm-project目录:

\begin{shell}
$ cd llvm-project
\end{shell}

目录中是所有LLVM项目，每个项目都在自己的目录中。最值得注意的是，LLVM核心库位于LLVM子目录中。LLVM项目使用分支用于后续版本开发(“release/17.x”)和标签(“llvmg -17.0.1”)来标记某个版本。使用前面的clone命令，可以获得当前的开发状态。本书使用LLVM 17。要将LLVM 17的第一个版本检出到一个名为llvm-17的分支中，可以输入以下命令:

\begin{shell}
$ git checkout -b llvm-17 llvmorg-17.0.1
\end{shell}

通过前面的步骤，就克隆了整个库，并从标记创建了分支。这是最灵活的方法。

Git还允许只克隆一个分支或标记(包括历史记录)。使用git clone -{}-branch release/X https://github.com/llvm/llvm-project，只克隆版本release/17.x分支及其历史。然后，就可以看到LLVM 17发布分支的最新状态。若需要确切的发布版本，只需要像之前一样从发布标签创建一个分支。

使用-{}-depth=1选项，就是Git的浅克隆，可以避免下载太多历史记录。这节省了时间和空间，但显然限制了在本地可以做的事情，包括根据发布标记签出分支。

\mySubsubsection{1.3.3.}{创建构建目录}

LLVM不支持内联构建，并且需要一个单独的构建目录。最简单的方法是在llvm-project目录中创建，这是当前目录。简单起见，将构建目录命名为build。这里，Unix和Windows系统的命令不同。在类Unix系统上，可以使用以下命令:

\begin{shell}
$ mkdir build
\end{shell}

在Windows上，使用以下命令:

\begin{shell}
$ md build
\end{shell}

现在，就已经准备好使用该目录下的CMake工具创建构建系统文件了。

\mySubsubsection{1.3.4.}{生成构建系统文件}

为了使用Ninja生成编译LLVM和clang的构建系统文件，可以运行以下命令:

\begin{shell}
$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release \
  -DLLVM_ENABLE_PROJECTS=clang -B build -S llvm
\end{shell}

-G选项告诉CMake为哪个系统生成构建文件。该选项的常用值如下:

\begin{itemize}
\item
Ninja – for the Ninja build system

\item
Unix Makefiles – for GNU Make

\item
Visual Studio 17 VS2022 – for Visual Studio and MS Build

\item
Xcode – for Xcode projects
\end{itemize}

使用-B选项，告诉CMake构建目录的路径。类似地，可以使用-S选项指定源目录。可以通过使用-D选项设置各种变量来影响生成过程，通常以CMAKE\_(由CMAKE定义)或LLVM\_(由LLVM定义)为前缀。

如前所述，我们也对与LLVM一起编译clang感兴趣。使用LLVM\_ENABLE\_PROJECTS=clang，允许CMake除了为LLVM生成构建文件外，还为clang生成构建文件。此外，CMAKE\_BUILD\_TYPE=Release变量告诉CMAKE它应该为“发布”构建生成构建文件。

-G选项的默认值取决于平台，而构建类型的默认值取决于工具链，但可以使用环境变量定义自己的首选项。CMAKE\_GENERATOR变量控制生成器，CMAKE\_BUILD\_TYPE变量指定构建类型。若使用bash或类似的shell，可以这样设置变量:

\begin{shell}
$ export CMAKE_GENERATOR=Ninja
$ export CMAKE_BUILD_TYPE=Release
\end{shell}

若使用的是Windows命令提示符，可以这样设置变量:

\begin{shell}
$ set CMAKE_GENERATOR=Ninja
$ set CMAKE_BUILD_TYPE=Release
\end{shell}

有了这些设置，创建构建系统文件的命令就变成了下面这样，这样更容易输入:

\begin{shell}
$ cmake -DLLVM_ENABLE_PROJECTS=clang -B build -S llvm
\end{shell}

将在自定义构建过程一节中找到更多关于CMake变量的信息。

\mySubsubsection{1.3.5.}{编译和安装LLVM}

生成构建文件后，可以使用以下命令编译LLVM和clang:

\begin{shell}
$ cmake --build build
\end{shell}

我们告诉CMake在配置步骤中生成Ninja文件，所以这个命令在底层运行Ninja。但若为支持多构建配置的生成器(如Visual Studio)生成构建文件，则需要使用-{}-config选项指定要用于构建的配置。根据硬件资源的不同，该命令的运行时间从15分钟(具有大量CPU内核、内存和快速存储的服务器)到几个小时(具有有限内存的双核Windows笔记本)不等。

默认情况下，Ninja使用所有可用的CPU内核。这有利于提高编译速度，但可能会阻止其他任务的运行;例如，在Windows操作系统的笔记本电脑上，几乎不可能在运行Ninja时上网。幸运的是，可以使用-j选项限制资源使用。

假设有四个可用的CPU内核，而Ninja应该只使用两个(因为你有并行任务要运行)。就使用以下命令进行编译:

\begin{shell}
$ cmake --build build -j2
\end{shell}

编译完成后，运行测试检查是否一切都如预期的那样工作:

\begin{shell}
$ cmake --build build --target check-all
\end{shell}

同样，该命令的运行时随着可用硬件资源的不同而变化很大。checkall Ninja目标运行所有测试用例。为每个包含测试用例的目录生成目标。使用check-llvm而不是check-all会运行LLVM测试，但不会运行clang测试，checkllvm-codegen仅从LLVM(即llvm/test/CodeGen目录)运行CodeGen目录中的测试。

也可以进行快速手动检查。LLVM应用程序之一是LLVM编译器llc。若使用-version选项运行，会显示LLVM的版本，主机CPU和所有支持的架构:

\begin{shell}
$ build/bin/llc --version
\end{shell}

若在编译LLVM时遇到困难，应该查阅入门LLVM系统文档(\url{https://releases.llvm.org/17.0.1/docs/GettingStarted.html#common-problems})中的常见问题部分，了解常见问题的解决方案。

最后一步，安装二进制文件:

\begin{shell}
$ cmake --install build
\end{shell}

类Unix系统上，安装目录是/usr/local。在Windows上，使用C:\verb|\|Program Files\verb|\|LLVM。这可以修改，下一节将解释如何实现。
